package abs.service;

import abs.dao.CompaniasDAO;
import abs.dao.GrupoProveedoresDAO;
import abs.dao.ProveedoresDAO;

import abs.domain.Companias;
import abs.domain.GrupoProveedores;
import abs.domain.Proveedores;

import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for GrupoProveedores entities
 * 
 */

@Service("GrupoProveedoresService")
@Transactional
public class GrupoProveedoresServiceImpl implements GrupoProveedoresService {

	/**
	 * DAO injected by Spring that manages Companias entities
	 * 
	 */
	@Autowired
	private CompaniasDAO companiasDAO;

	/**
	 * DAO injected by Spring that manages GrupoProveedores entities
	 * 
	 */
	@Autowired
	private GrupoProveedoresDAO grupoProveedoresDAO;

	/**
	 * DAO injected by Spring that manages Proveedores entities
	 * 
	 */
	@Autowired
	private ProveedoresDAO proveedoresDAO;

	/**
	 * Instantiates a new GrupoProveedoresServiceImpl.
	 *
	 */
	public GrupoProveedoresServiceImpl() {
	}

	/**
	 * Save an existing GrupoProveedores entity
	 * 
	 */
	@Transactional
	public void saveGrupoProveedores(GrupoProveedores grupoproveedores) {
		GrupoProveedores existingGrupoProveedores = grupoProveedoresDAO.findGrupoProveedoresByPrimaryKey(grupoproveedores.getGrppr100cdgo());

		if (existingGrupoProveedores != null) {
			if (existingGrupoProveedores != grupoproveedores) {
				existingGrupoProveedores.setGrppr100cdgo(grupoproveedores.getGrppr100cdgo());
				existingGrupoProveedores.setGrppr100name(grupoproveedores.getGrppr100name());
				existingGrupoProveedores.setGrppr100tipo(grupoproveedores.getGrppr100tipo());
				existingGrupoProveedores.setGrppr100clas(grupoproveedores.getGrppr100clas());
				existingGrupoProveedores.setGrppr100esta(grupoproveedores.getGrppr100esta());
				existingGrupoProveedores.setGrppr100load(grupoproveedores.getGrppr100load());
				existingGrupoProveedores.setGrppr100fead(grupoproveedores.getGrppr100fead());
				existingGrupoProveedores.setGrppr100lomo(grupoproveedores.getGrppr100lomo());
				existingGrupoProveedores.setGrppr100femo(grupoproveedores.getGrppr100femo());
			}
			grupoproveedores = grupoProveedoresDAO.store(existingGrupoProveedores);
		} else {
			grupoproveedores = grupoProveedoresDAO.store(grupoproveedores);
		}
		grupoProveedoresDAO.flush();
	}

	/**
	 * Return all GrupoProveedores entity
	 * 
	 */
	@Transactional
	public List<GrupoProveedores> findAllGrupoProveedoress(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<GrupoProveedores>(grupoProveedoresDAO.findAllGrupoProveedoress(startResult, maxRows));
	}

	/**
	 * Delete an existing Companias entity
	 * 
	 */
	@Transactional
	public GrupoProveedores deleteGrupoProveedoresCompanias(String grupoproveedores_grppr100cdgo, String related_companias_co000nocia) {
		GrupoProveedores grupoproveedores = grupoProveedoresDAO.findGrupoProveedoresByPrimaryKey(grupoproveedores_grppr100cdgo, -1, -1);
		Companias related_companias = companiasDAO.findCompaniasByPrimaryKey(related_companias_co000nocia, -1, -1);

		grupoproveedores.setCompanias(null);
		related_companias.getGrupoProveedoreses().remove(grupoproveedores);
		grupoproveedores = grupoProveedoresDAO.store(grupoproveedores);
		grupoProveedoresDAO.flush();

		related_companias = companiasDAO.store(related_companias);
		companiasDAO.flush();

		companiasDAO.remove(related_companias);
		companiasDAO.flush();

		return grupoproveedores;
	}

	/**
	 */
	@Transactional
	public GrupoProveedores findGrupoProveedoresByPrimaryKey(String grppr100cdgo) {
		return grupoProveedoresDAO.findGrupoProveedoresByPrimaryKey(grppr100cdgo);
	}

	/**
	 * Delete an existing Proveedores entity
	 * 
	 */
	@Transactional
	public GrupoProveedores deleteGrupoProveedoresProveedoreses(String grupoproveedores_grppr100cdgo, Integer related_proveedoreses_pr100copr) {
		Proveedores related_proveedoreses = proveedoresDAO.findProveedoresByPrimaryKey(related_proveedoreses_pr100copr, -1, -1);

		GrupoProveedores grupoproveedores = grupoProveedoresDAO.findGrupoProveedoresByPrimaryKey(grupoproveedores_grppr100cdgo, -1, -1);

		related_proveedoreses.setGrupoProveedores(null);
		grupoproveedores.getProveedoreses().remove(related_proveedoreses);

		proveedoresDAO.remove(related_proveedoreses);
		proveedoresDAO.flush();

		return grupoproveedores;
	}

	/**
	 * Load an existing GrupoProveedores entity
	 * 
	 */
	@Transactional
	public Set<GrupoProveedores> loadGrupoProveedoress() {
		return grupoProveedoresDAO.findAllGrupoProveedoress();
	}

	/**
	 * Return a count of all GrupoProveedores entity
	 * 
	 */
	@Transactional
	public Integer countGrupoProveedoress() {
		return ((Long) grupoProveedoresDAO.createQuerySingleResult("select count(o) from GrupoProveedores o").getSingleResult()).intValue();
	}

	/**
	 * Save an existing Proveedores entity
	 * 
	 */
	@Transactional
	public GrupoProveedores saveGrupoProveedoresProveedoreses(String grppr100cdgo, Proveedores related_proveedoreses) {
		GrupoProveedores grupoproveedores = grupoProveedoresDAO.findGrupoProveedoresByPrimaryKey(grppr100cdgo, -1, -1);
		Proveedores existingproveedoreses = proveedoresDAO.findProveedoresByPrimaryKey(related_proveedoreses.getPr100copr());

		// copy into the existing record to preserve existing relationships
		if (existingproveedoreses != null) {
			existingproveedoreses.setPr100copr(related_proveedoreses.getPr100copr());
			existingproveedoreses.setPr100ruc(related_proveedoreses.getPr100ruc());
			existingproveedoreses.setPr100nomb(related_proveedoreses.getPr100nomb());
			existingproveedoreses.setPr100ciud(related_proveedoreses.getPr100ciud());
			existingproveedoreses.setPr100dire(related_proveedoreses.getPr100dire());
			existingproveedoreses.setPr100telf(related_proveedoreses.getPr100telf());
			existingproveedoreses.setPr100emai(related_proveedoreses.getPr100emai());
			existingproveedoreses.setPr100rele(related_proveedoreses.getPr100rele());
			existingproveedoreses.setPr100cgre(related_proveedoreses.getPr100cgre());
			existingproveedoreses.setPr100auto(related_proveedoreses.getPr100auto());
			existingproveedoreses.setPr100cont(related_proveedoreses.getPr100cont());
			existingproveedoreses.setPr100tar(related_proveedoreses.getPr100tar());
			existingproveedoreses.setPr100obs(related_proveedoreses.getPr100obs());
			existingproveedoreses.setPr100obs2(related_proveedoreses.getPr100obs2());
			existingproveedoreses.setPr100plaz(related_proveedoreses.getPr100plaz());
			existingproveedoreses.setPr100ctadb(related_proveedoreses.getPr100ctadb());
			existingproveedoreses.setPr100ctacr(related_proveedoreses.getPr100ctacr());
			existingproveedoreses.setPr100load(related_proveedoreses.getPr100load());
			existingproveedoreses.setPr100fead(related_proveedoreses.getPr100fead());
			existingproveedoreses.setPr100lomo(related_proveedoreses.getPr100lomo());
			existingproveedoreses.setPr100femo(related_proveedoreses.getPr100femo());
			related_proveedoreses = existingproveedoreses;
		} else {
			related_proveedoreses = proveedoresDAO.store(related_proveedoreses);
			proveedoresDAO.flush();
		}

		related_proveedoreses.setGrupoProveedores(grupoproveedores);
		grupoproveedores.getProveedoreses().add(related_proveedoreses);
		related_proveedoreses = proveedoresDAO.store(related_proveedoreses);
		proveedoresDAO.flush();

		grupoproveedores = grupoProveedoresDAO.store(grupoproveedores);
		grupoProveedoresDAO.flush();

		return grupoproveedores;
	}

	/**
	 * Delete an existing GrupoProveedores entity
	 * 
	 */
	@Transactional
	public void deleteGrupoProveedores(GrupoProveedores grupoproveedores) {
		grupoProveedoresDAO.remove(grupoproveedores);
		grupoProveedoresDAO.flush();
	}

	/**
	 * Save an existing Companias entity
	 * 
	 */
	@Transactional
	public GrupoProveedores saveGrupoProveedoresCompanias(String grppr100cdgo, Companias related_companias) {
		GrupoProveedores grupoproveedores = grupoProveedoresDAO.findGrupoProveedoresByPrimaryKey(grppr100cdgo, -1, -1);
		Companias existingcompanias = companiasDAO.findCompaniasByPrimaryKey(related_companias.getCo000nocia());

		// copy into the existing record to preserve existing relationships
		if (existingcompanias != null) {
			existingcompanias.setCo000nocia(related_companias.getCo000nocia());
			existingcompanias.setCo000logo(related_companias.getCo000logo());
			existingcompanias.setCo000nomb(related_companias.getCo000nomb());
			existingcompanias.setCo000nosu(related_companias.getCo000nosu());
			existingcompanias.setCo000dire(related_companias.getCo000dire());
			existingcompanias.setCo000repr(related_companias.getCo000repr());
			existingcompanias.setCo000cont(related_companias.getCo000cont());
			existingcompanias.setCo000nreg(related_companias.getCo000nreg());
			existingcompanias.setCo000clca(related_companias.getCo000clca());
			existingcompanias.setCo000mofu(related_companias.getCo000mofu());
			existingcompanias.setCo000notr(related_companias.getCo000notr());
			existingcompanias.setCo000idtr(related_companias.getCo000idtr());
			existingcompanias.setCo000meci(related_companias.getCo000meci());
			existingcompanias.setCo000mepr(related_companias.getCo000mepr());
			existingcompanias.setCo000incc(related_companias.getCo000incc());
			existingcompanias.setCo000inut(related_companias.getCo000inut());
			existingcompanias.setCo000incp(related_companias.getCo000incp());
			existingcompanias.setCo000incf(related_companias.getCo000incf());
			existingcompanias.setCo000baca(related_companias.getCo000baca());
			existingcompanias.setCo000fir1(related_companias.getCo000fir1());
			existingcompanias.setCo000fir2(related_companias.getCo000fir2());
			existingcompanias.setCo000esta(related_companias.getCo000esta());
			existingcompanias.setCo000load(related_companias.getCo000load());
			existingcompanias.setCo000fead(related_companias.getCo000fead());
			existingcompanias.setCo000lomo(related_companias.getCo000lomo());
			existingcompanias.setCo000femo(related_companias.getCo000femo());
			related_companias = existingcompanias;
		}

		grupoproveedores.setCompanias(related_companias);
		related_companias.getGrupoProveedoreses().add(grupoproveedores);
		grupoproveedores = grupoProveedoresDAO.store(grupoproveedores);
		grupoProveedoresDAO.flush();

		related_companias = companiasDAO.store(related_companias);
		companiasDAO.flush();

		return grupoproveedores;
	}
}
